package cn.iocoder.yudao.module.scrm.service.clue;

import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat;
import cn.iocoder.yudao.module.scrm.controller.admin.clue.vo.*;
import cn.iocoder.yudao.module.scrm.dal.dataobject.clue.ClueDO;

import javax.validation.Valid;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Set;

/**
 * 线索 Service 接口
 *
 * @author admin
 */
public interface ClueService {

    /**
     * 创建线索
     *
     * @param createReqVO 创建信息
     * @return 编号
     */
    Integer createClue(@Valid ClueSaveReqVO createReqVO);

    /**
     * 更新线索
     *
     * @param updateReqVO 更新信息
     */
    void updateClue(@Valid ClueSaveReqVO updateReqVO);

    /**
     * 删除线索
     *
     * @param id 编号
     */
    void deleteClue(Integer id);

    /**
     * 获得线索
     *
     * @param id 编号
     * @return 线索
     */
    ClueDO getClue(Integer id);

    /**
     * 获得线索详情-带操作记录详情
     *
     * @param id 编号
     * @return 线索
     */
    ClueDO getDetail(Integer id);

    /**
     * 获得线索分页
     *
     * @param pageReqVO 分页查询
     * @return 线索分页
     */
    PageResult<ClueDO> getCluePage(CluePageReqVO pageReqVO, Integer tenantId);

    /**
     * 导出所有数据-使用 {@link DictFormat} 注解进行字典值转换成字典标签
     *
     * @param pageReqVO 分页查询
     * @return 线索分页
     */
    PageResult<ClueDO> getCluePageExport(CluePageReqVO pageReqVO);

    /**
     * 批量导入线索-能更新与新增的导入
     *
     * @param importClues 导入线索列表
     * @return 导入结果
     */
    ClueImportExcelRespVO importClueList(List<ClueImportExcelVO> importClues, boolean isUpdateSupport);

    /**
     * 批量导入线索--不能进行更新只能进行新增的导入
     *
     * @param importClues 导入线索列表
     * @return 导入结果
     */
    ClueImportExcelRespVO importClueListNotCanUpdate(List<ClueImportExcelVO> importClues);

    /**
     * 变更线索状态-改为无效
     *
     * @param ids           多个线索id
     * @param newStateValue 状态
     * @return 是否成功
     */
    Boolean clueChangeState(Set<Long> ids, String newStateValue);


    /**
     * 转移线索-转移线索负责人
     *
     * @param clueTransferAffiliationVo 更新信息
     */
    Boolean clueTransferAffiliation(@Valid ClueTransferAffiliationVo clueTransferAffiliationVo, Long userId);

    /**
     * 转为客户
     *
     * @param transferClientVo 更新信息
     */
    Boolean clueTransferClient(@Valid ClueTransferClientVo transferClientVo, Long userId);


    /**
     * 更新线索相关的跟进信息
     *
     * @param id                 编号
     * @param contactNextTime    下次联系时间
     * @param contactLastContent 最后联系内容
     */
    void updateClueFollowUp(Long id, LocalDateTime contactNextTime, String contactLastContent);


}